/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.celularessuc.gco.neg;

import com.jjsoft.celularessuc.gco.dao.GenericController;
import com.jjsoft.celularessuc.gco.mdl.Detallefactura;
import com.jjsoft.celularessuc.gco.mdl.Factura;
import com.jjsoft.celularessuc.gco.mdl.Gasto;
import com.jjsoft.celularessuc.gco.mdl.Ingreso;
import com.jjsoft.celularessuc.gco.mdl.Serie;
import com.jjsoft.celularessuc.gco.mdl.Sucursal;
import com.jjsoft.celularessuc.gco.util.configuraciones;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Johnny
 */
public class FacturaManager {

    GenericController<Factura> controladorFactura = new GenericController<Factura>();
    ArticuloSucursalManager asm = new ArticuloSucursalManager();
    SerieManager sm = new SerieManager();

    public void guardarFactura(Factura factura) {
        controladorFactura.create(factura);
        for (int i = 0; i < factura.getDetallefacturaList().size(); i++) {
            asm.ReducirStock(factura.getDetallefacturaList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetallefacturaList().get(i).getCantidad());
            if (!factura.getDetallefacturaList().get(i).getSerie().equals("")) {
                sm.quitaSerie(factura.getDetallefacturaList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetallefacturaList().get(i).getSerie());
            }
        }
        configuraciones.getInstance().getDiario().setValor(configuraciones.getInstance().getDiario().getValor() + factura.getTotal());
        DiarioManager dm = new DiarioManager();
        dm.editarDiario(configuraciones.getInstance().getDiario());
        Ingreso ingreso = new Ingreso();
        ingreso.setConcepto("Venta con factura a " + factura.getCedulaCliente().getNombres() + " " + factura.getCedulaCliente().getApellidos());
        ingreso.setFecha(factura.getFechaEmision());
        ingreso.setHora(factura.getFechaEmision().toLocaleString().substring(factura.getFechaEmision().toLocaleString().indexOf(" ")));
        ingreso.setValor(factura.getTotal());
        ingreso.setIdUsuario(configuraciones.getInstance().getUsuario());
        ingreso.setNumDocumento(factura.getNumero());
        new IngresoManager().registrarIngreso(ingreso);
    }

    public Factura buscarPorNumero(int numero, Sucursal sucursal) {
        try {
            Factura factura = controladorFactura.findWhere(new Factura(), "numero=" + numero + " and idSucursal=" + sucursal.getIdsucursal()).get(0);
            GenericController<Detallefactura> cdt = new GenericController<Detallefactura>();
            List<Detallefactura> listadetalle = cdt.findWhere(new Detallefactura(), "idFactura=" + factura.getIdFactura());
            factura.setDetallefacturaList(listadetalle);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }

    public void anularFactura(Factura factura) {
        factura.setEstado(1);
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm = new SerieManager();
        GastoManager gm = new GastoManager();
        try {
            controladorFactura.edit(factura);
            for (int i = 0; i < factura.getDetallefacturaList().size(); i++) {
                asm.ReducirStock(factura.getDetallefacturaList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetallefacturaList().get(i).getCantidad() * -1);
                if (!factura.getDetallefacturaList().get(i).getSerie().equals("")) {
                    sm.devuelveSerie(factura.getDetallefacturaList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetallefacturaList().get(i).getSerie());
                }
            }

            Gasto gasto = new Gasto();
            Date d = new Date();
            gasto.setIdUsuario(configuraciones.getInstance().getUsuario());
            gasto.setFecha(d);
            gasto.setHora(d.toLocaleString().substring(d.toLocaleString().indexOf(" ")));
            gasto.setConcepto("Anulacion de venta con factura N:" + factura.getNumero());
            gasto.setValor(factura.getTotal());
            configuraciones.getInstance().getDiario().setValor(configuraciones.getInstance().getDiario().getValor() - factura.getTotal());
            gm.registrarGasto(gasto);
            DiarioManager dm = new DiarioManager();
            dm.editarDiario(configuraciones.getInstance().getDiario());

        } catch (Exception ex) {
            System.err.println(ex.getLocalizedMessage());
        }
    }
    public List<Factura> buscarPorCedula(String cedula)
    {
        return controladorFactura.findWhere(new Factura(), "cedula_cliente='" + cedula + "'");
    }
    public List<Factura> buscarPorFechas(Date fecha1, Date fecha2)
    {
        String fechaIni=(fecha1.getYear()+1900)+"-"+(fecha1.getMonth()+1)+"-"+fecha1.getDate()+" 00:00:00";
        String fechafin=(fecha2.getYear()+1900)+"-"+(fecha2.getMonth()+1)+"-"+fecha2.getDate()+" 23:59:59";
        return controladorFactura.findWhere(new Factura(), "fecha_emision>='"+fechaIni+"' and fecha_emision<='"+fechafin+"'");
    }
    public List<Factura> buscarPorFechas(Date fecha1, Date fecha2, Sucursal sucursal)
    {
        String fechaIni=(fecha1.getYear()+1900)+"-"+(fecha1.getMonth()+1)+"-"+fecha1.getDate()+" 00:00:00";
        String fechafin=(fecha2.getYear()+1900)+"-"+(fecha2.getMonth()+1)+"-"+fecha2.getDate()+" 23:59:59";
        return controladorFactura.findWhere(new Factura(), "fecha_emision>='"+fechaIni+"' and fecha_emision<='"+fechafin+"' and idSucursal="+sucursal.getIdsucursal());
    }
    public List<Detallefactura> buscarDetalle(Factura factura) {
        GenericController<Detallefactura> controladorDetalle = new GenericController<Detallefactura>();
        return controladorDetalle.findWhere(new Detallefactura(), "idFactura=" + factura.getIdFactura());
    }
    public Detallefactura buscarDetalleSerie(Serie serie) {
        GenericController<Detallefactura> cdt = new GenericController<Detallefactura>();
        try {
            List<Detallefactura> listadetalle = cdt.findWhere(new Detallefactura(), "idArticulo="+serie.getIdArticulo().getCodigo()+" and serie ='"+serie.getNumSerie()+"'");
            Detallefactura detalle = listadetalle.get(listadetalle.size()-1);
            return detalle;
        } catch (Exception ex) {
            return null;
        }
    }
}
